package uiMain;

import gestorbienraizok.inmuebles.Apartamento;
import gestorbienraizok.inmuebles.Banho;
import gestorbienraizok.inmuebles.Casa;
import gestorbienraizok.inmuebles.Garaje;
import gestorbienraizok.inmuebles.Pieza;
import gestorbienraizok.inmuebles.ServiciosAdicionales;
import gestorbienraizok.inmuebles.Torre;
import gestorbienraizok.inmuebles.Unidad;
import gestorbienraizok.usuarios.Administrador;
import gestorbienraizok.usuarios.Cliente;
import gestorbienraizok.usuarios.ClienteAnonimo;
import gestorbienraizok.usuarios.ClienteDemandador;
import gestorbienraizok.usuarios.ClienteOferente;
import gestorbienraizok.usuarios.Funcionario;
import gestorbienraizok.usuarios.FuncionarioJefe;
import gestorbienraizok.usuarios.Persona;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.Scanner;

public class bienRaizOk {

    public static LinkedList<Unidad> listaDeUnidades = new LinkedList();
    public static LinkedList<Persona> listaDePersonas = new LinkedList();
    public static LinkedList<ClienteAnonimo> listaDeClientesAnonimos = new LinkedList();
    public static Scanner entrada = new Scanner(System.in);
    public static Persona usuarioActual;

    public static void main(String[] args) {

        cargarCasosDePrueba();

        while (true) {
            System.out.println("Bienvenido a Bien Raiz OK\n");

            MenuDeConsola menuPrincipal = new MenuDeConsola();
            menuPrincipal.mostrarMenu();

            System.out.print("\nSeleccione la opción deseada: ");
            byte numeroDeOpciones = menuPrincipal.getNumeroDeOpciones();

            entrada = new Scanner(System.in);
            long seleccion = entrada.nextLong();
            while (seleccion < 1 || seleccion > numeroDeOpciones) {
                System.out.print("Seleccione una opción válida (1-" + numeroDeOpciones + "): ");
                entrada = new Scanner(System.in);
                seleccion = entrada.nextLong();
            }
            menuPrincipal.listaOpciones.get((byte) (seleccion - 1)).ejecutar();

        }

    }

    public static String convertirBooleano(boolean bool) {
        return ((bool) ? "Si" : "No");
    }

    public static String formatearPrecio(long precio) {
        DecimalFormat formatter = new DecimalFormat("$###,###,###");
        return formatter.format(precio);
    }

    public static String formatearPrecio(float precio) {
        DecimalFormat formatter = new DecimalFormat("$###,###,###");
        return formatter.format(precio);
    }

    public static void pausar() {
        System.out.print("Presione ENTER para volver a su menú principal...");        
        entrada = new Scanner(System.in);
        entrada.nextLine();
        System.out.println("\n\n\n");
    }

    private static void cargarCasosDePrueba() {
        //CASOS DE PRUEBA
        Administrador administrador1 = new Administrador(1010, "holi", "Yennifer Marcela Tobón");
        listaDePersonas.add(administrador1);

        FuncionarioJefe funcionarioJefe1 = new FuncionarioJefe(1152447369, "holi", "Nicolás Henao Arango", 3500000);
        listaDePersonas.add(funcionarioJefe1);

        Funcionario funcionario1 = new Funcionario(2020, "holi", "Simón Palacio", 1300000);
        listaDePersonas.add(funcionario1);
        funcionarioJefe1.registrarSubordinado(funcionario1);

        ClienteOferente clienteOferente1 = new ClienteOferente(new Cliente(1040742678, "holi", "Juan Diego Merino", "Calle 30 #12-10", 3522659, 3163237562L, (byte) 4));
        listaDePersonas.add(clienteOferente1);

        ClienteOferente clienteOferente2 = new ClienteOferente(new Cliente(3030, "holi", "Daniel Henao", "Tr 72B #69-36", 4112756, 3128674512L, (byte) 4));
        listaDePersonas.add(clienteOferente2);

        ClienteDemandador clienteDemandador1 = new ClienteDemandador(new Cliente(4040, "holi", "Francisco Moreno", "Cl 19S #23-75", 2665628, 3148872121L, (byte) 4), 45000000, "Sur", (byte) 5, "Ninguna", funcionario1);
        funcionario1.anhadirALaLista(clienteDemandador1);
        listaDePersonas.add(clienteDemandador1);

        ClienteDemandador clienteDemandador2 = new ClienteDemandador(new Cliente(5050, "holi", "Alejandra Álvarez", "Cr 76 #38-22", 3162327, 3105458323L, (byte) 4), 5000000, "Cualquiera", (byte) 3, "Ninguna", funcionario1);
        funcionario1.anhadirALaLista(clienteDemandador2);
        listaDePersonas.add(clienteDemandador2);

        ServiciosAdicionales serviciosAdicionales1 = new ServiciosAdicionales(false, false, true, true, true, false, true);
        ServiciosAdicionales serviciosAdicionales2 = new ServiciosAdicionales(true, true, false, false, false, true, false);
        ServiciosAdicionales serviciosAdicionales3 = new ServiciosAdicionales(false, false, false, false, false, true, true);

        Unidad unidad1 = new Unidad(1001, "Parcelación Alcazar", "Cr 37A #1-S 138", (byte) 3, true, serviciosAdicionales1);
        listaDeUnidades.add(unidad1);
        Casa casa1 = new Casa("C1", (byte) 3, unidad1, clienteOferente1);
        unidad1.agregarCasa(casa1);
        clienteOferente1.anhadirInmueble(casa1);//Cliente Juan Diego Merino
        casa1.setRol((byte) 1);//Solo venta
        casa1.setDisponibilidad((byte) 3);
        casa1.setPrecioDeVenta(210000000);
        casa1.setTarifaDeArrendamiento(0);
        casa1.setAreaTotal(184);
        casa1.setPatio(true);
        casa1.anhadirCuarto(new Banho(10, true, true, false, true));
        casa1.anhadirCuarto(new Banho(6, false, false, false, true));
        casa1.anhadirCuarto(new Pieza(12, "Comedor"));
        casa1.anhadirCuarto(new Pieza(20, "Cocina"));
        casa1.anhadirCuarto(new Pieza(8, "Estar"));
        casa1.anhadirGaraje(new Garaje(17, 2, true));

        Unidad unidad2 = new Unidad(1002, "Ed. Castilla", "Tv 5D #39-24", (byte) 6, true, serviciosAdicionales2);
        listaDeUnidades.add(unidad2);
        Torre torre1DeUnidad2 = new Torre((byte) 1, (byte) 8, (byte) 2, true, unidad2);
        unidad2.agregarTorre(torre1DeUnidad2);
        Apartamento apto1 = new Apartamento("A1", true, torre1DeUnidad2, clienteOferente1);
        torre1DeUnidad2.agregarApartamento(apto1);
        clienteOferente1.anhadirInmueble(apto1);
        apto1.setRol((byte) 3);//Venta y arriendo
        apto1.setPrecioDeVenta(142000000);
        apto1.setTarifaDeArrendamiento(1130000);
        apto1.setAreaTotal(131);
        apto1.setPatio(true);
        apto1.anhadirCuarto(new Banho(10, true, true, false, false));
        apto1.anhadirCuarto(new Banho(14, false, true, true, true));
        apto1.anhadirCuarto(new Banho(6, false, false, false, true));
        apto1.anhadirCuarto(new Pieza(12, "Biblioteca"));
        apto1.anhadirCuarto(new Pieza(7, "Alcoba"));
        apto1.anhadirCuarto(new Pieza(23, "Vestier"));
        apto1.anhadirCuarto(new Pieza(26, "Cocina"));
        apto1.anhadirCuarto(new Pieza(14, "Comedor"));

        Unidad unidad3 = new Unidad(1003, "Castillo de la castellana", "Cra 84 #33-01", (byte) 4, true, serviciosAdicionales3);
        listaDeUnidades.add(unidad3);
        Torre torre5DeUnidad3 = new Torre((byte) 5, (byte) 16, (byte) 4, true, unidad3);
        Torre torre6DeUnidad3 = new Torre((byte) 6, (byte) 20, (byte) 4, true, unidad3);
        unidad3.agregarTorre(torre5DeUnidad3);
        unidad3.agregarTorre(torre6DeUnidad3);
        Apartamento apto2 = new Apartamento("A2", false, torre5DeUnidad3, clienteOferente1);
        torre5DeUnidad3.agregarApartamento(apto2);
        clienteOferente1.anhadirInmueble(apto2);
        apto2.setRol((byte) 2);//Solo arriendo
        apto2.setPrecioDeVenta(0);
        apto2.setTarifaDeArrendamiento(820000);
        apto2.setAreaTotal(78);
        apto2.setPatio(false);
        apto2.anhadirCuarto(new Banho(6, true, true, false, false));
        apto2.anhadirCuarto(new Banho(24, false, false, false, true));
        apto2.anhadirCuarto(new Banho(11, false, true, true, true));
        apto2.anhadirCuarto(new Banho(9, true, true, true, false));
        apto2.anhadirCuarto(new Pieza(13, "Biblioteca"));
        apto2.anhadirCuarto(new Pieza(18, "Comedor"));

        Apartamento apto3 = new Apartamento("A3", true, torre6DeUnidad3, clienteOferente2);
        torre6DeUnidad3.agregarApartamento(apto3);
        clienteOferente2.anhadirInmueble(apto3);
        apto3.setRol((byte) 4);//No disponible
        apto3.setPrecioDeVenta(0);
        apto3.setTarifaDeArrendamiento(0);
        apto3.setAreaTotal(78);
        apto3.setPatio(false);
        apto3.anhadirCuarto(new Banho(6, true, true, false, false));
        apto3.anhadirCuarto(new Banho(24, false, false, false, true));
        apto3.anhadirCuarto(new Banho(11, false, true, true, true));
        apto3.anhadirCuarto(new Banho(9, true, true, true, false));
        apto3.anhadirCuarto(new Pieza(13, "Biblioteca"));
        apto3.anhadirCuarto(new Pieza(18, "Comedor"));

        Casa casa2 = new Casa("C2", (byte) 2, unidad3, clienteOferente2);
        unidad3.agregarCasa(casa2);
        clienteOferente2.anhadirInmueble(casa2);
        casa2.setRol((byte) 2);//Solo arriendo
        casa2.setPrecioDeVenta(0);
        casa2.setTarifaDeArrendamiento(1700000);
        casa2.setAreaTotal(205);
        casa2.setPatio(true);
        casa2.anhadirCuarto(new Banho(10, false, false, false, true));
        casa2.anhadirCuarto(new Banho(17, true, true, false, true));
        casa2.anhadirCuarto(new Banho(7, false, false, false, false));
        casa2.anhadirCuarto(new Pieza(35, "Sala"));
        casa2.anhadirCuarto(new Pieza(20, "Alcoba"));
        casa2.anhadirGaraje(new Garaje(23, 3, true));
        casa2.anhadirGaraje(new Garaje(14, 2, false));
    }
}
